#-*- coding:utf-8 -*-

from django.shortcuts import render,redirect
import models
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth import login,logout,authenticate
from forms import ArticleForm,handle_uploaded_file
# Create your views here.

def index(request):
    articles = models.Article.objects.all()
    return render(request,'index.html',{'articles':articles})

def category(request,category_id):
    '''满足：数据库Article表的categroy_id字段 = category/(\d+)传过来的数字（板块id）
    这个(\d+)和category表一一对应'''
    articles = models.Article.objects.filter(categroy_id=category_id)
    return render(request,'index.html',{'articles':articles})

def article_detail(request,article_id):
    '''获取数据库Article表的id字段 = article_detail/(\d+)传过来的数字（article_id）那行，
    当然，获取的是一个对象，一行数据的对象，用get取值（比filter快），但要做异常处理
    ObjectDoesNotExist就是对象不存在，直接跳转到404页面即可
    如果有结果，'''
    try:
        article_obj = models.Article.objects.get(id=article_id)
    except ObjectDoesNotExist as e:
        return render(request,'404.html',{'error_msg':u'文章不存在'})
    return render(request,'article.html',{'article_obj':article_obj})

def account_logout(request):
    #直接调取Django的用户logout方法，原理其实就是把session等一系列东西删除了
    logout(request)
    return redirect('/')

def account_login(request):
    '''
    print request.POST
    <QueryDict: {u'username': [u'user1'], u'csrfmiddlewaretoken': [u's2TpgvESdbnTSODRfixuEAK53RKVJKKr'], u'password': [u'ddd']}>
    用get能根据相应key获取到输入的用户名和密码
    把输入的用户名和密码和原生user表中进行匹配，如果成功，user就有值，否则就是None；
    下一步就是登陆login(),把session信息写入到数据库里等操作；
    定义一个错误信息，默认为空，如果user=None了，就返回错误信息到前端展示。
    '''
    error_msg = ''
    if request.method == "POST":
        username=request.POST.get('username')
        password=request.POST.get('password')
        user = authenticate(username=username,password=password)
        if user is not None:
            login(request,user)
            return redirect('/')
        else:
            error_msg = '用户名密码错误！'
    return render(request,'login.html',{'error_msg':error_msg})

def new_article(request):
    if request.method == "POST":
        '''
        Django的form表单不只支持前端，也支持对输入的验证，此例就只是验证
        创建表单对象，将提交的所有数据和上传的文件封装到form对象，验证字段；
        如果提交的数据符合要求，还差一个字段，作者，他可以在request中取到，然后提交到数据库创建；
        否则，返回错误信息；
        '''
        form = ArticleForm(request.POST,request.FILES)
        if form.is_valid():
            all_data = form.clean()
            '''存储上传的文件图片
            通过request.FILES['head_img(前端name)']是文件句柄，将他传入handle_uploaded_file存储img
            数据库中只是记录的文件路径'''
            new_img_path = handle_uploaded_file(request,request.FILES['head_img'])
            all_data['head_img'] = new_img_path
            all_data['author_id']=request.user.userprofile.id
            '''request.user.userprofile.id是对应的真实用户名
            数据库插入的时候，create()方法只能返回true或false，但我们想让它返回这个对象，
            然后在页面展示，所以用save()方式。这个被保存的对象传到前端也好取值
            注意：插入数据库是form中的数据，不是提交的所有数据，这个得看form字段'''
            new_article_obj = models.Article(**all_data)
            new_article_obj.save()
            return render(request,'new_article.html',{"new_article_obj":new_article_obj})
        else:
            print form.errors
    catagory_list = models.Category.objects.all()
    # print catagory_list
    return render(request,'new_article.html',{'catagory_list':catagory_list})